#include "sfsis.h"
//0 单色模式
//1 彩虹模式
//2 呼吸灯
//3 流星模式
#define MONOCHROME 0
#define RAINBOW 1
#define BREATH 2
#define SHUTTLE 3


//灯带总个数
#define MAX_LED_NUM  255

//灯带最高亮度 
#define MAX_BRIGHTNESS 42
//为了方便快速配置默认模式，可以在这里快速设置出场模式
#define START_MODE MONOCHROME

/*用于定义出场的时候，未作任何配置时的状态*/
/*该配置理论上不可修改，当大批量出货时，可做特定修改*/
/*初始化配置函数*/
//KEIL 在编译时，必须勾选C99
const Config_u gSCfg_u =
{
    .entity = 
    {
         .common = 
        {
            .entity = 
            {
                .onOff = 1,        //默认打开状态
                .brightness = 255, //默认亮度
                .directAccess = 0, //直接访问默认状态为关
                .startOnOff = 1,
                .startBrightness = 0xFF,
                .doModeWrite = 0,
                .doModeFactoryWrite = 0,
                .doFactoryWrite = 0,
                .inAnimationSelect = 0,
                .outAnimationSelect = 0,
            }
        },

        .mode = {
            .entity = 
            {
                .mode = START_MODE,
                .context = 
                {   
                    /*单色模式配置*/
                    #if (START_MODE == MONOCHROME)
                    .monochrome = 
                    {
                        .color = 
                        {
                            0xFF,
                            0xFF,
                            0xFF,
                        },
                    }
                    #endif

                    /*彩虹模式配置*/
                    #if (START_MODE == RAINBOW)
                    .rainbow = 
                    {
                        .speed = 1,//运动速度
                    }
                    #endif

                    /*呼吸模式配置*/
                    #if (START_MODE == BREATH)
                    .breath = 
                    {
                        //呼吸默认色彩
                        .color=  
                        {
                            0xFF,
                            0xFF,
                            0xFF,
                        },
                        .speed = 1,//运动速度
                    }
                    #endif

                    /*流星模式配置*/
                    #if (START_MODE == SHUTTLE)
                    .meteor = 
                    {
                        .color = 
                        {
                            0xFF,
                            0xFF,
                            0xFF,
                        },          
                        .speed = 1,//运动速度
                        .segNumber = 3, //三段
                    },    
                    #endif

                },
            },
        },
        .modeFactory = {
            .entity = {
                /*
                *目前发现使用3个点效果好些，使用如下配置
                *打圈的表示使能
                *   3X     4O       5X
                *
                *   2O              6O
                *
                *   1X      8X       7X
                * 灯带安装方式顺时针
                * 使能 2 4 6，
                */
                .mode_screen_hiddenMask = 0xD5,//1101 0101
                //.mode_screen_hiddenMask= 0, ////每个bit，1代表该段不作为运算参考。共24个bit，目前只用到第一个
                .mode_screen_offsetRef = 
                {
                    MAX_LED_NUM/8*0,//每个段距离原点的偏移量。从0-7要按照顺序由小到大。当配置为反向时，offset不受影响
                    MAX_LED_NUM/8*1,
                    MAX_LED_NUM/8*2,
                    MAX_LED_NUM/8*3,
                    MAX_LED_NUM/8*4,
                    MAX_LED_NUM/8*5,
                    MAX_LED_NUM/8*6,
                    MAX_LED_NUM/8*7,
                },
                .mode_music_start_offset = 10, //效果起始点
                .mode_music_end_offset = 10,//效果结束点
                .mode_music_isSwitchRL = 0,//切换RL工作位置
            }
        },

        .factory = 
        {
            .entity =
            {
                .logicOriginPoint = 0,//逻辑原点,在实际运算中，灯带被想象成一个首尾相连的元，逻辑原点可以解决安装中的问题
                .isReverse = 0,//扫描方向
                .maxBrightness = MAX_BRIGHTNESS,//最大亮度限制
                .rgbType = 3,//3:BRG 灯带的RGB模式。和硬件有关，有些灯按照RGB排列，有些则是GBR 
                .enabledDotNumber = MAX_LED_NUM,//灯带的使能个数
            }


        },

        .firmware = 
        {
            .entity = 
            {
                .version = 0x04,
                .adcVal = 0,
                .led1State = 1,
            }
        },
        .wireless = 
        {
            .entity = 
            {
                .regs =
                {
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0
                }
            }
        },
    }
   
};

/*在CC ARM编译器下，压制1296错误，这个错误是对我们定义指针类型的警告 */
#if defined(__CC_ARM)
// Suppress warning message: extended constant initialiser used
#pragma diag_suppress 1296
#elif defined(__ICCARM__)
#elif defined(__GNUC__)
#endif


//C99语法新特性，给指定的地址赋值
#define CONFIG_SET(head, stru, unit,authType) [(su8)(head + CONFIG_OFFSET(stru,unit))] = authType

#define CONFIG_SET_BLOCK(head,tail,authType)  [(head) ... (tail)] = authType


//此表存储掉电丢失寄存器标志位，在此表中的寄存器，均不可直接写入flash，可能可以通过一些命令写入，但直接写入是不支持的
//此表已添加的内容，谨慎修改，新增加的寄存器可以在此处添加操作属性
const Auth_Type regAuth_Mask[256] = 
{
    CONFIG_SET(CONFIG_MAP_COMMON_HEAD,Config_Common,onOff,AUTH_CFG_SHADOW),
    CONFIG_SET(CONFIG_MAP_COMMON_HEAD,Config_Common,brightness,AUTH_CFG_SHADOW),
    CONFIG_SET(CONFIG_MAP_COMMON_HEAD,Config_Common,directAccess,AUTH_CFG_SHADOW),
    CONFIG_SET(CONFIG_MAP_COMMON_HEAD,Config_Common,doModeWrite,AUTH_CFG_SHADOW_RESET),
    CONFIG_SET(CONFIG_MAP_COMMON_HEAD,Config_Common,doModeFactoryWrite,AUTH_CFG_SHADOW_RESET),
    CONFIG_SET(CONFIG_MAP_COMMON_HEAD,Config_Common,doFactoryWrite,AUTH_CFG_SHADOW_RESET),

    CONFIG_SET_BLOCK(CONFIG_MAP_MODE_HEAD,CONFIG_MAP_MODE_TAIL,AUTH_CFG_INDIRECT),

    CONFIG_SET_BLOCK(CONFIG_MAP_MODEFACTORY_HEAD,CONFIG_MAP_MODEFACTORY_TAIL,AUTH_CFG_INDIRECT),

    CONFIG_SET_BLOCK(CONFIG_MAP_FACTORY_HEAD,CONFIG_MAP_FACTORY_TAIL,AUTH_CFG_INDIRECT),

    CONFIG_SET_BLOCK(CONFIG_MAP_FIRMWARE_HEAD,CONFIG_MAP_FIRMWARE_TAIL,AUTH_CFG_READONLY),

    CONFIG_SET_BLOCK(CONFIG_MAP_WIRELESS_HEAD,CONFIG_MAP_WIRELESS_TAIL,AUTH_CFG_INDIRECT),

};